package evemanutool.utils.httpdata; import java.text.NumberFormat; import java.util.List; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; public abstract class ProgressWorker extends SwingWorker<Void, Integer> { //Constants. public static final int PROGRESS_MIN = 0; public static final int PROGRESS_MAX = 1000; //GUI private JProgressBar pB; //Progress data. private final int numOfWork; private NumberFormat percentFormat; /* * To update progress * implementation should use publish(numWorkLeft) to send * the number of work parts left. */ public ProgressWorker(JProgressBar pB, int numOfWork) { this.pB = pB; this.numOfWork = numOfWork; percentFormat = NumberFormat.getPercentInstance(); percentFormat.setMaximumFractionDigits(1); } @Override protected Void doInBackground() throws Exception { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Start progress. pB.setStringPainted(true); } }); return null; } @Override protected void process(List<Integer> chunks) { double progress = (numOfWork - chunks.get(chunks.size() - 1)) / (double) numOfWork; pB.setString(percentFormat.format(progress)); pB.setValue((int) (progress * PROGRESS_MAX + 0.5)); } @Override protected void done() { //Set progress to 100%. pB.setValue(PROGRESS_MAX); pB.setStringPainted(false); } }